package com.ruicheng.iam.util;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.sql.*;
import java.util.ArrayList;

/**
 * 数据库连接工具
 * @author huang guang yue
 * @version v1.0.0
 * @date 2020 2020/11/25 9:56
 */
@Slf4j
public class JdbcUtil {

    /**
     * 获取 Statement
     * @param ip 数据库 IP
     * @param port 数据库端口
     * @param username 数据库用户
     * @param password 数据库密码
     * @return java.sql.Statement
     */
    public static Statement getStatement(String ip, int port, String username, String password){
        String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":orcl";
        try {
            // 注册驱动
            Class.forName("oracle.jdbc.OracleDriver");
            // 获取连接
            Connection connection = DriverManager.getConnection(url, username, password);
            if (connection == null){
                log.error("获取数据库连接异常，url：{}，用户：{}，密码：{}", url, username, password);
                return null;
            }
            // 获取 Statement
            Statement statement = connection.createStatement();
            if (statement == null){
                log.error("获取 Statement 异常");
                return null;
            }
            return statement;
        } catch (ClassNotFoundException | SQLException e) {
            log.error("获取数据库连接异常，url：{}，用户：{}，密码：{}", url, username, password);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过登录名获取密码
     * @param loginName 登录名
     * @param tableName 表名
     * @param loginNameFiled 登陆字段
     * @param passwordFiled 密码字段
     * @return java.lang.String
     */
    public static String getPasswordByUsername(Statement statement, String loginName, String username, String tableName, String loginNameFiled, String passwordFiled){
        String sql = "SELECT \"" + passwordFiled + "\" from \"" + username + "\".\"" + tableName + "\" where \"" + loginNameFiled + "\" = '" + loginName + "'";
        try {
            ResultSet resultSet = statement.executeQuery(sql);

            ArrayList<String> list = new ArrayList<>();
            while (resultSet.next()){
                list.add(resultSet.getString(passwordFiled));
            }
            if (list.size() < 1){
                log.error("没有查询到数据，sql：{}", sql);
                return null;
            }
            if (list.size() > 1){
                log.error("当前登录名查询到多个数据，sql: {}, 结果（只查询了密码）：{}，返回第一条数据：{}", sql, JSONObject.toJSONString(list), list.get(0));
            }
            return list.get(0);
        } catch (SQLException e) {
            e.printStackTrace();
            log.error("执行 sql 异常或获取返回值异常，执行的 sql: {}，注：返回值异常未记录", sql);
            return null;
        }
    }
}
